from django.db import models
from user.models import UserProfile

# Create your models here.
# 查询性能优化，查询效率提升十倍有余，只通过related_name查询好友关系的话需要多次查询，所以新建friendship,方便进行排序
# 该方案缺陷在于写入性能不高，因为每次写入都需要更新好友关系表，数据一致性通过开启事务进行控制
class Friendship(models.Model):
    """正式好友关系表"""
    user1 = models.ForeignKey(UserProfile, on_delete=models.CASCADE, related_name='friendships_user1')
    user2 = models.ForeignKey(UserProfile, on_delete=models.CASCADE, related_name='friendships_user2')
    created_time = models.DateTimeField(auto_now_add=True)
    class Meta:
        #约束 确保好友关系的唯一性
        unique_together = [('user1', 'user2')]  # 防止重复记录
        indexes = [
            #建立索引，好友关系查询优化
            # 即使有了复合索引。
            # 但查询条件如果只使用复合索引的第一个字段（如me），
            # 复合索引仍然有效。但单独为friend建立索引，是因为当查询条件只包含friend时，复合索引无法被利用，这时候单字段索引就发挥作用了。
            models.Index(fields=['user1', 'user2']),  # 复合索引
            models.Index(fields=['user1']),
            models.Index(fields=['user2'])
        ]

    def save(self, *args, **kwargs):
        # 自动排序保证user1 < user2
        ids = sorted([self.user1_id, self.user2_id])
        self.user1_id, self.user2_id = ids[0], ids[1]
        super().save(*args, **kwargs)